import java.math.BigDecimal;
import java.math.RoundingMode;

public class Ieee754Converter {

    /**
     * 解析IEEE 754双精度浮点数二进制字符串，先保留三位小数，再乘以1000转为整数，最终返回String类型
     *
     * @param binaryStr 64位IEEE 754双精度浮点数二进制字符串（必须含64个字符，仅0和1）
     * @return 处理后整数的String形式（格式：保留三位小数×1000的结果）
     * @throws IllegalArgumentException 当输入二进制字符串格式不合法时抛出
     */
    public static String get3DecimalMult1000AsStringFromIeee754(String binaryStr) {
        // 1. 输入格式校验：确保64位二进制字符串（仅含0和1）
        if (binaryStr == null || binaryStr.length() != 64) {
            throw new IllegalArgumentException("输入必须是64位的二进制字符串");
        }
        if (!binaryStr.matches("[01]+")) {
            throw new IllegalArgumentException("二进制字符串仅允许包含字符'0'和'1'");
        }

        // 2. 拆分IEEE 754双精度三部分：符号位(1位)、指数位(11位)、尾数位(52位)
        String signBit = binaryStr.substring(0, 1);          // 符号位：0=正，1=负
        String exponentBits = binaryStr.substring(1, 12);    // 指数位：决定数值量级
        String mantissaBits = binaryStr.substring(12, 64);   // 尾数位：决定数值精度

        // 3. 计算符号因子：正数为1，负数为-1
        int sign = "0".equals(signBit) ? 1 : -1;

        // 4. 计算实际指数：指数位十进制值 - 偏移量1023（IEEE 754双精度标准）
        long exponentDec = Long.parseLong(exponentBits, 2);
        int realExponent = (int) (exponentDec - 1023);

        // 5. 计算尾数值：基于"隐含整数位1"，尾数=1 + 尾数位/2^52（用BigDecimal确保精度）
        BigDecimal mantissa = new BigDecimal("1.0");
        for (int i = 0; i < mantissaBits.length(); i++) {
            if (mantissaBits.charAt(i) == '1') {
                BigDecimal bitContribution = BigDecimal.ONE.divide(new BigDecimal(2).pow(i + 1), 64, BigDecimal.ROUND_HALF_UP);
                mantissa = mantissa.add(bitContribution);
            }
        }

        // 6. 计算完整数值：符号 × 尾数 × 2^指数
        BigDecimal fullValue = mantissa
                .multiply(new BigDecimal(2).pow(realExponent))
                .multiply(new BigDecimal(sign));

        // 7. 核心处理：保留三位小数 → 乘以1000 → 转为整数（避免浮点数误差）
        BigDecimal threeDecimalValue = fullValue.setScale(3, RoundingMode.HALF_UP); // 保留三位小数（四舍五入）
        BigDecimal multiply1000Value = threeDecimalValue.multiply(new BigDecimal(1000)); // 乘以1000
        long resultInt = multiply1000Value.setScale(0, RoundingMode.UNNECESSARY).longValue(); // 转为整数（此时无小数位，无需舍入）

        // 8. 转换为String类型返回
        return String.valueOf(resultInt);
    }

    // 测试方法：验证String类型整数结果的正确性
    public static void main(String[] args) {
        // 测试用例1：二进制表示123.45（保留三位小数123.450 → ×1000=123450）
        String binary1 = "0100000111011001101100101111101100101100001101100011010100111111";
        System.out.printf(get3DecimalMult1000AsStringFromIeee754(binary1));
    }
}
    